package com.kamistoat.meimeimall.common.sharding;

import com.kamistoat.meimeimall.common.sharding.strategy.DefaultShardingStrategy;
import com.kamistoat.meimeimall.common.sharding.strategy.ShardingStrategy;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 分库分表的自定义注解。
 * 在Dao上添加此注解后，需要将第一个参数固定为String类型的分表因子，若不是String类型或者参数值是null，则直接使用ShardingContext中的分表位
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Sharding {

    /**
     * 是否分表。默认只要添加了该注解，就是开启分库分表
     */
    boolean sharding() default true;

    /**
     * 作为分库分表的字段名称。必须填写，必须和Dao方法中的参数别名对应。
     * 若方法为 select(Long id) -- 则应填 "id".
     * 若方法为 select(@Param("userId") Long id) -- 则应填 "userId".
     * 若方法为 select(Integer status, UserEntity userEntity) -- 则应填 "userEntity.id".
     */
    String shardingKey();

    /**
     * 基础库名。将在分库分表时被真实库名替换。必须填写
     */
    String databaseName();

    /**
     * 基础表名。将在分库分表时被真实表名替换。必须填写
     */
    String tableName();

    /**
     * 分表策略。可以不填，若不填则使用默认策略
     */
    Class<? extends ShardingStrategy> strategy() default DefaultShardingStrategy.class;

    /**
     * 读写分离。默认在主库操作
     */
    String masterSlave() default ShardingConstants.MASTER;
}
